package com.atguigu.gmall.product.service.api;

import com.alibaba.fastjson.JSONObject;
import com.atguigu.gmall.model.product.*;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

public interface ManagerService {
    List<BaseCategory1> getCategory1List();

    List<BaseCategory2> getCategory2List(Integer category1Id);

    List<BaseCategory3> getCategory3List(Integer category2Id);

    /**
     * 根据分类 id 查询对应的平台属性数据的集合
     * @param category1Id
     * @param category2Id
     * @param category3Id
     * @return
     */
    List<BaseAttrInfo> getBaseAttrInfo(
            Long category1Id,
            Long category2Id,
            Long category3Id);

    void saveBaseAttrInfo(BaseAttrInfo baseAttrInfo);

    /**
     * 根据平台属性id，查询平台属性值集合
     * @param attrId
     * @return
     */
    List<BaseAttrValue> getAttrValueList(Long attrId);

    /**
     * 查询 SPU 分页信息
     * @param page 页码
     * @param limit 每页显示数据条数
     * @param category3Id 三级分类 id
     * @return 封装好的分页信息对象
     */
    IPage<SpuInfo> getSpuInfoPage(Long page, Long limit, Long category3Id);

    /**
     * 查询全部销售属性名数据
     * @return
     */
    List<BaseSaleAttr> getBaseSaleAttrList();

    void saveSpuInfo(SpuInfo spuInfo);

    /**
     * 根据 spuId 查询 SPU 图片地址组成的集合
     * @param spuId
     * @return
     */
    List<SpuImage> getSpuImageList(Long spuId);

    /**
     * 根据 spuId 查看 SPU 包含的销售属性
     * @param spuId
     * @return
     */
    List<SpuSaleAttr> getSpuSaleAttrList(Long spuId);

    void saveSkuInfo(SkuInfo skuInfo);

    IPage<SkuInfo> getSkuInfoPage(Long pageNum, Long pageSize);

    void updateSkuSaleStatus(Long skuId, int isSale);

    /**
     * 为了前台显示商品详情，根据 skuId 查询 SkuInfo 对象
     * 同时这里包含 SKU 图片信息
     * @param skuId
     * @return
     */
    SkuInfo getSkuInfoById(Long skuId);

    /**
     * 根据三级分类 id，到分类视图中查询数据
     * @param category3Id
     * @return
     */
    BaseCategoryView getCategoryViewBy3Id(Long category3Id);

    /**
     * 根据 skuId 查询价格
     * @param skuId
     * @return
     */
    BigDecimal getSkuPriceById(Long skuId);

    /**
     * 根据 spuId 查询全部销售属性和销售属性值，
     * 同时根据 skuId 把 SKU 中选中的销售属性值标记出来
     * @param skuId
     * @param spuId
     * @return
     */
    List<SpuSaleAttr> getSpuSaleAttrAndValueWithCheck(Long skuId, Long spuId);

    /**
     * 根据 spuId 查询对应关系：从销售属性值组合到 skuId
     * @param spuId
     * @return
     */
    Map<String, Object> getSaleAttrValuesBySpu(Long spuId);

    /**
     * 获取全部分类信息
     * @return JSONObject 对标 JSON 数据的工具类，使用 alibaba 的包
     */
    List<JSONObject> getBaseCategoryList();

    /**
     * 根据 skuId 查询一个具体 SKU 的平台属性（包括平台属性值）
     * SKU 在某一个平台属性下选定的平台属性值肯定是一个单个的值
     * 在 BaseAttrInfo 类中 attrValueList 属性是平台属性值的集合，
     * 现在因为只有一个值，所以 attrValueList 集合的长度是 1
     * @param skuId
     * @return
     */
    List<BaseAttrInfo> getBaseAttrInfoListBySkuId(Long skuId);
}
